import java.util.Arrays;

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        shellSort(arr);
    }

    /**
     * 使用逐步推到的方式来编写希尔排序
     * DuanXS
     */
    public static void shellSort(int[] arr) {
        int temp = 0;
        int count = 0;
        //根据前面的逐步分析，使用循环处理
        for (int x = arr.length/2; x > 0; x/=2) {
            //希尔排序的第x轮排序
            //因为是第x轮排序，是将10个数据分成5/2=2组
            for (int i = x; i < arr.length; i++) {
                //遍历各组中所有的元素（共x组，每组有x/2个元素），步长x
                for (int j = i - x; j >= 0; j -= x) {
                    //如果当前的元素大于加上步长后的哪个元素，说明交换
                    if (arr[j] > arr[j + x]) {
                        temp = arr[j];
                        arr[j] = arr[j + x];
                        arr[j + x] = temp;
                    }
                }
            }
            System.out.println("希尔排序"+(++count)+"轮后=" + Arrays.toString(arr));
        }
/*
        //希尔排序的第一轮排序
        //因为是第一轮排序，是将10个数据分成5组
        for (int i = 5; i < arr.length; i++) {
            //遍历各组中所有的元素（共5组，每组有2个元素），步长5
            for (int j = i - 5; j >= 0; j -= 5) {
                //如果当前的元素大于加上步长后的哪个元素，说明交换
                if (arr[j] > arr[j + 5]) {
                    temp = arr[j];
                    arr[j] = arr[j + 5];
                    arr[j + 5] = temp;
                }
            }
        }
        System.out.println("希尔排序1轮后=" + Arrays.toString(arr));


        //希尔排序的第2轮排序
        //因为是第2轮排序，是将10个数据分成5/2=2组
        for (int i = 2; i < arr.length; i++) {
            //遍历各组中所有的元素（共2组，每组有2个元素），步长2
            for (int j = i - 2; j >= 0; j -= 2) {
                //如果当前的元素大于加上步长后的哪个元素，说明交换
                if (arr[j] > arr[j + 2]) {
                    temp = arr[j];
                    arr[j] = arr[j + 2];
                    arr[j + 2] = temp;
                }
            }
        }
        System.out.println("希尔排序2轮后=" + Arrays.toString(arr));


        //希尔排序的第3轮排序
        //因为是第3轮排序，是将10个数据分成2/2=1组
        for (int i = 1; i < arr.length; i++) {
            //遍历各组中所有的元素（共1组，每组有1个元素），步长1
            for (int j = i - 1; j >= 0; j -= 1) {
                //如果当前的元素大于加上步长后的哪个元素，说明交换
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println("希尔排序3轮后=" + Arrays.toString(arr));
 */
    }
}
